home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 2 / MacMania 2.toast / Demo's / Tools&Utilities / Programming / CIncludesTool / modified version / source files / writeFile.c < prev   
Encoding:
Text File  |  1991-08-28  |  2.7 KB  |  138 lines  |  [TEXT/MPS ]

  1. // writeFile.c
  2. //
  3. // file writing functions for CIncludesCode MPW tool
  4.  
  5. #include "CIncludesCode.h"
  6. #include <Memory.h>
  7. #include <Files.h>
  8. #include <StdIO.h>
  9. #include <OSUtils.h>
  10.  
  11. extern long numFiles;
  12. extern strArray **filesHdl;
  13. extern Handle dictionary[numDictionaries];
  14. extern Handle dependencies;
  15.  
  16. void writeData(short fileid,long cnt,Ptr p)
  17. {
  18. long count = cnt;
  19. OSErr error;
  20.  
  21. error = FSWrite(fileid,&count,p);
  22. if (error)
  23.     {
  24.     errorExit("Write operation failed!");
  25.     }  // if error
  26. }  // writeData()
  27.  
  28. long longAlign(long value)
  29. {
  30. long n = (value % 4);
  31. return (n ? value + 4 - n : value);
  32. }  // longAlign()
  33.  
  34. void shrinkDictionary(Handle dict)
  35. {
  36. long newSize;
  37.  
  38. newSize = *((long*) *dict);    // end pointer
  39. newSize = longAlign(newSize);
  40. SetHandleSize(dict,newSize);
  41. if (MemError())
  42.     {
  43.     errorExit("shrinkDictionary failed");
  44.     }  // if MemError()
  45. }  // shrinkDictionary()
  46.  
  47. void alignHandle(Handle dict)
  48. {
  49. long newSize = longAlign(GetHandleSize(dict));
  50.     
  51. SetHandleSize(dict,newSize);
  52. if (MemError())
  53.     {
  54.     errorExit("alignHandle failed");
  55.     }  // if MemError()
  56. }  // alignHandle()
  57.  
  58.  
  59. short openIdentifierFile(Str255 filename)
  60. {
  61. short fileid = 0;
  62. OSErr error;
  63. SysEnvRec world;
  64.  
  65. SysEnvirons(1,&world);
  66. error = FSOpen(filename,world.sysVRefNum,&fileid);
  67. if (error)
  68.     {
  69.     (void) Create(filename,world.sysVRefNum,'????','DATA');
  70.     (void) FSOpen(filename,world.sysVRefNum,&fileid);
  71.     }  // if error
  72. else
  73.     {
  74.     (void) SetEOF(fileid,0L);
  75.     }  // else if error    
  76. return fileid;
  77. }  // openIdentifierFile()
  78.  
  79.  
  80. void makeDataHeader(dataHeaderType *dhPtr)
  81. {
  82. short i;
  83. long p;
  84.     
  85. dhPtr->numFiles = numFiles;
  86. p = sizeof(dataHeaderType);
  87. dhPtr->nameArrayOffset = p;
  88. p += GetHandleSize((Handle) filesHdl);
  89. dhPtr->dependencyArrayOffset = p;
  90. p += GetHandleSize(dependencies);
  91.  
  92. for (i = 0; i < numDictionaries; ++i)
  93.     {
  94.     dhPtr->dictionaryOffsets[i] = p;
  95.     p += GetHandleSize(dictionary[i]);
  96.     }  // for i
  97. }  // makeDataHeader()
  98.  
  99. void closeFile(short fileid)
  100. {
  101. short volRefNum;
  102.     
  103. (void) GetVRefNum(fileid,&volRefNum);
  104. (void) FlushVol(0L,volRefNum);
  105. (void) FSClose(fileid);
  106. }  // closeFile()
  107.  
  108. void makeDataFile(void)
  109. {
  110. short i;
  111. short fileid;
  112. dataHeaderType ourHeader;
  113.     
  114. fprintf(stderr,"\nWriting Datafile to disk...\n");
  115. fileid = openIdentifierFile(dataFilename);
  116.  
  117. alignHandle((Handle) filesHdl);
  118. alignHandle(dependencies);
  119. for (i = 0; i < numDictionaries; ++i)
  120.     {
  121.     shrinkDictionary(dictionary[i]);
  122.     }  // for i
  123.         
  124. makeDataHeader(&ourHeader);
  125.     
  126. writeData(fileid,sizeof(dataHeaderType),(Ptr) &ourHeader);
  127. writeData(fileid,GetHandleSize((Handle) filesHdl),(Ptr) *filesHdl);
  128. writeData(fileid,GetHandleSize(dependencies),*dependencies);
  129.  
  130. for (i = 0; i < numDictionaries; ++i)
  131.     {
  132.     writeData(fileid,GetHandleSize(dictionary[i]),*dictionary[i]);
  133.     }  // for i
  134.  
  135. closeFile(fileid);
  136. }  // makeDataFile()
  137.  
  138. // end of writeFile.c